public class code2 {
//    力扣 150 两数相加，(链表形式)


    // 这道题目已经说明了两个链表的数据存储形式为 “逆序”
    // l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] 观察这个示例
    // [8,9,9,9,0,0,0,1] 最终的输出可以发现，在最后一个位置上填了一个 1
    // 这就说明了当第一个位置上的值相加有进位时，最后是要将这个值补到最后一个位置上的！！

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // 针对这道题目，首先需要创建出两个全新的节点
        // 这两个全新的节点一个是用来记录当前要返回的新链表的 head 另一个则是用来记录我们每次计算后得到的新值并且存储到
        // 要返回的列表后
        ListNode head = null;
        ListNode cur = null;
        // 这里需要定义一个参数，用来记录当前两数相加后 进位 处的值
        int other = 0;

        // 尝试获取两个链表中的内容并且尝试将两个链表中的值进行计算
        // （题目中说这里的数据元素是以逆序的形式排列的，所以可以直接根据上下对应的关系直接进行计算）
        while (l1 != null || l2 != null) {
            int num1 = l1 == null ? 0 : l1.val;
            int num2 = l2 == null ? 0 : l2.val;

            // 对获取到的两个数字进行计算
            int sum = num1 + num2 + other;

            // 在计算后，将每一个结果连接到新的链表上
            if(head == null) {
                head = new ListNode(sum % 10);
                cur = head;
            } else {
                // 当头结点已经存在，此时就需要在 cur 之后在创建一个新的节点并且将元素连接起来
                cur.next = new ListNode(sum % 10);
                cur = cur.next;
            }
            // 在添加完新的节点后，需要更新一下进位处记录的值
            other = sum / 10;

            // 之后就是让两个链表的值向后进行移动
            if(l1 != null) {
                l1 = l1.next;
            }
            if(l2 != null) {
                l2 = l2.next;
            }
        }
        // 最后需要记录的是，如果最后一位处的两值相加出现了进位值，就需要单独的在创建出一个节点将该位置的值存储起来
        if(other > 0) {
            cur.next = new ListNode(other);
        }
        return head;
    }
}
